%% 粒子群算法优化Particle swarm optimization
clear,clc
%% 参数初始化
f=@(x)1/12*sum(x.^4)-1/2*sum(x.^2)+sum(abs(x-4));% 目标函数
lb=-1e2*ones(1,6);ub=1e2*ones(1,6);%变量范围
n=length(lb);% 变量个数
%% 粒子群算法计算过程
N=100;% 粒子个数
mn=10;% 求解次数
mn1=1e3;% 最大迭代次数
Vm=10;% 最大速度
c1=2;% 自我学习因子
c2=2;% 群体学习因子
w=1;% 惯性权重
x0=zeros(N,n);x1=x0;% 粒子群初始化
v=zeros(N,n);% 速度初始化
result0=zeros(N,1);% 储存迭代结果
result_final=[];% 储存最后结果
for i=1:mn
    tic
    for i1=1:N
        x1(i1,:)=lb+rand(1,n).*(ub-lb);
    end
    pbest=x1;% 粒子个体最佳位置初始化
    for i1=1:N
        result0(i1)=f(x1(i1,:));
    end
    [result1,k]=sort(result0);
    gbest=x1(k(1),:);% 群体最佳位置初始化
    gb0=f(gbest);
    for i1=1:mn1
        % 速度与位置迭代
        for i2=1:N
            v(i2,:)=w*v(i2,:)+c1*rand()*(pbest(i2,:)-x1(i2,:))+...
                c2*rand()*(gbest-x1(i2,:));
            if(norm(v(i2,:))>Vm)
                v(i2,:)=v(i2,:)/norm(v(i2,:))*Vm;
            end
        end
        x1=x1+v;
        % 更新个体最优位置
        for i2=1:N
            pb0=f(x1(i2,:));
            if(pb0<result0(i2))
                pbest(i2,:)=x1(i2,:);
                result0(i2)=pb0;
            end
        end
        % 更新群体最优位置
        [result1,k]=sort(result0);
        gbest1=x1(k(1),:);
        if(result1(1)<gb0)
            gbest=gbest1;
            gb0=result1(1);
        end
    end
    result_final=[result_final;[gb0,gbest]];
    toc
end